﻿using CDH_VoteSys.Models.Database;
using CDH_VoteSys.Models.Project_Data_Upload;
using CDH_VoteSys.service;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System.Linq;
using System;
using System.Security.Claims;
using System.Xml.Linq;
using System.Transactions;
using System.Security.Cryptography;

namespace CDH_VoteSys.Controllers
{
	/// <summary>
	/// 资料上传模块
	/// </summary>
	[Route("api/[controller]/[action]")]
	[ApiController]
	public class Project_Data_Upload : Controller
	{
		//                     类型     变量名
		// 私有 只读（它仅可以在构造函数里赋值，赋值后不能修改）  int a
		private readonly CDH_VoteSysContext _db;
		private readonly IJWTService _jwtService;

		/// <summary>
		/// 构造方法 构造注入
		/// 把数据库上下文初始化
		/// </summary>
		/// <param name="db"></param>
		/// <param name="jwtService"></param>
		public Project_Data_Upload(CDH_VoteSysContext db, IJWTService jwtService)
		{
			_db = db;
			_jwtService = jwtService;
		}

		/// <summary>
		/// 校验用户是否上传过该类别的投票项目（需授权）
		/// </summary>
		/// <returns></returns>
		/// 输入：类别标识 
		/// 输出：是或否
		[Authorize]
		[HttpPost]
		public string Project_Data_Check(DataUpload_Check dataUpload_Check)
		{
			//接口具体实现
			//获取用户信息
			//获取用户信息           登录用户 消息载荷 查询第一条（条件是Type==）   获取登录用户的用户名
			var Email = Response.HttpContext.User.Claims.FirstOrDefault(x => x.Type == ClaimTypes.Email).Value;
			//查询用户是否上传过该类别的投票项目
			var result = _db.CompanyDataUploads.Count(x => x.Uemail == Email && x.ComProjectType == dataUpload_Check.Com_Project_Data_Name);
			//返回结果,输出是或否
			if (result == 0)
			{
				return "否";
			}
			return "是";
		}

		/// <summary>
		/// 资料上传接口（需授权）
		/// </summary>
		/// <returns></returns>
		/// 输入：投票项目信息、项目类别
		/// 输出：消息
		[HttpPost]
		[Authorize]
		public string Projecrt_Data_add(DataUpload_Add dataUpload_Add)
		{
			//接口具体实现
			//开启事务锁 保证数据一致性 死锁
			using (var scope = new TransactionScope())
			{
				try
				{
					//获取用户信息           登录用户 消息载荷 查询第一条（条件是Type==）   获取登录用户的用户名
					//如果Email不为空且不为null，那么条件成立，执行后续的代码块,返回Email
					//获取用户邮箱
					var Email = Response.HttpContext.User.Claims.FirstOrDefault(x => x.Type == ClaimTypes.Email)?.Value;
					if (string.IsNullOrEmpty(Email))
					{
						return "没有找到邮箱";
					}
					//请求参数的规则判断
					//加需求 判断公司Logo 不能为空 如果为空 做出提示
					if (string.IsNullOrEmpty(dataUpload_Add.Com_logo))
					{
						return "公司Logo不能为空";
					}
					//加需求 判断公司名称 不能为空 如果为空 做出提示
					if (string.IsNullOrEmpty(dataUpload_Add.Com_name))
					{
						return "公司名称不能为空";
					}
					//加需求 判断企业简介 不能为空 如果为空 做出提示
					if (string.IsNullOrEmpty(dataUpload_Add.Com_project_introduction))
					{
						return "企业简介不能为空";
					}
					//加需求 判断企业项目类型 不能为空 如果为空 做出提示
					if (string.IsNullOrEmpty(dataUpload_Add.Com_project_type))
					{
						return "企业项目类型不能为空，请选择工程类、技术类、产品类";
					}
					//加需求 判断获奖情况 不能为空 如果为空 做出提示
					if (dataUpload_Add.Award.Count == 0)
					{
						return "获奖情况不能为空";
					}
					//加需求 判断项目图片 不能少于1张 如果少于1张 做出提示
					if (dataUpload_Add.Award.Count < 1)
					{
						return "项目图片不能少于1张";
					}

					//实例化CompanyDataUploads对象
					var companyDataUploads = new CompanyDataUpload
					{
						//公司Logo
						ComLogo = dataUpload_Add.Com_logo,
						//公司名称
						ComName = dataUpload_Add.Com_name,
						//企业简介
						ComIntroduction = dataUpload_Add.Com_project_introduction,
						//企业项目类型
						ComProjectType = dataUpload_Add.Com_project_type,
						//获票数
						Vnum = 0,
						//用户邮箱
						Uemail = Email,
						//审核状态(仅读状态)
						ReviewStatus = 0,
					};
					//数据库上下.操作的表名.操作的方法(参数)
					_db.CompanyDataUploads.Add(companyDataUploads);
					//保存数据库
					_db.SaveChanges();

					//遍历获奖情况
					for (int i = 0; i < dataUpload_Add.Award.Count; i++)
					{
						//实例化CompanyAwardSituations对象
						var companyAwardSituations = new Award
						{
							//项目ID
							ComId = companyDataUploads.ComId,
							//获奖时间
							ComAwardTime = dataUpload_Add.Award[i].ComAwardTime,
							//获奖类型
							AwardType = dataUpload_Add.Award[i].AwardType,
							//项目图片1
							ProPic1 = dataUpload_Add.Award[i].ProPic1,
							//项目图片2
							ProPic2 = dataUpload_Add.Award[i].ProPic2,
							//项目图片3
							ProPic3 = dataUpload_Add.Award[i].ProPic3,
							//项目图片4
							ProPic4 = dataUpload_Add.Award[i].ProPic4,
							//项目图片5
							ProPic5 = dataUpload_Add.Award[i].ProPic5,
						};
						//数据库上下.操作的表名.操作的方法(参数)
						//数据批量添加
						_db.Awards.AddRange(companyAwardSituations);
					}

					//保存数据库,判断是否成功
					var row = _db.SaveChanges();
					//提交
					//数据批量添加
					if (row > 0)
					{
						// 遇到网络 数据库连接超时等问题 会导致数据写入失败
						// 如果所有的操作都执行成功，则Complete()会被调用来提交事务
						// 如果发生异常，则不会调用它并回滚事务
						scope.Complete();
						return "上传成功";
					}
					return "上传失败";
				}
				//NLOG记录错误日志
				catch (Exception ex)
				{
					//回滚
					scope.Dispose();
					return "上传失败";
				}
			}
		}
		/// <summary>
		/// 审核资料接口
		/// </summary>
		/// <returns></returns>
		/// 输入：投票项目Id、审核结果（通过、拒绝）
		/// 输出：消息
		[HttpPost]
		[Authorize]
		public string Audit_Data(Check_Data check_Data)
		{
			var com_data_upload = _db.CompanyDataUploads.FirstOrDefault(x => x.ComId == check_Data.Com_Id);
			//加需求 判断项目ID 不能为空 如果为空 做出提示
			if (string.IsNullOrEmpty(check_Data.Com_Id.ToString()))
			{
				return "项目ID不能为空";
			}
			//加需求 判断审核结果 不能为空 如果为空 做出提示
			if (string.IsNullOrEmpty(check_Data.Review_Stauts.ToString()))
			{
				return "审核结果不能为空";
			}
			//输入：投票项目Id、审核结果（通过、拒绝）
			//查询项目ID是否存在、审核状态是否为0待审核状态
			var audit_result = _db.CompanyDataUploads.Count(x => x.ComId == check_Data.Com_Id && x.ReviewStatus == 0);
			//判断项目ID是否存在、审核状态是否为0待审核状态
			if (audit_result == 0)
			{
				return "项目ID待审核";
			}

			//更新审核状态
			//项目ID
			com_data_upload.ComId = check_Data.Com_Id;
			//审核状态
			com_data_upload.ReviewStatus = check_Data.Review_Stauts;
			//数据库上下.操作的表名.操作的方法(参数)
			_db.CompanyDataUploads.Update(com_data_upload);
			//保存数据库
			var row = _db.SaveChanges();
			if (row > 0)
				return "审核成功";
			return "审核失败";
		}
	}
}
